package com.example.java_chatroom.component;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

//通过这类来记录用户在线的状态(维护了userId与WebsocketSession之间的关系)
@Slf4j
@Component
public class OnlineUserManager {
    //考虑到线程安全，要用ConcurrentHashMap
    private ConcurrentHashMap<Integer, WebSocketSession> sessions=new ConcurrentHashMap<>();

    //1)用户上线，往哈希表中插入数据
    public void online(Integer userId,WebSocketSession session){
        //针对账号多开的情况进行处理
        if(sessions.get(userId) != null){
            //不记录映射关系
            //因为后续消息的发送是通过映射关系来发送的
            log.info("["+userId+"] 已经登录，登录失败");
            return;
        }
        sessions.put(userId,session);
        log.info("["+userId+"] 上线");
    }

    //2)用户下线，往哈希表中删除数据
    public void offline(Integer userId,WebSocketSession session){
        WebSocketSession exitSession=sessions.get(userId);
        //判断是同一个用户才能下线
        if(exitSession == session){
            sessions.remove(userId);
            log.info("["+userId+"] 下线");
        }
    }

    //3)根据用户id获取对应的session
    public WebSocketSession getSession(Integer userId){
        return sessions.get(userId);
    }
}
